﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Max.PH6_2006A.LowCode.Common
{
    public class ReflectionHelper
    {
        //string sql = "insert into tablename(id,name,age) values(@id,@name,@age)";
        public static string EntityToDapperInsertSql<T>(T t)
        {
            string sql;
            string fieldName = "";
            string fieldValue = "";
            
            var m = t.GetType();   // typeof(T)


            //获取表名（先通过特性-TableAttribute获取，如果不存在则拼接字符串）
            var a = m.GetCustomAttributes(typeof(TableAttribute), true);
            string tableName;
            if (a != null && a.Length > 0)
            {
                tableName = ((TableAttribute)a[0]).Name;
            }
            else
            {
                //不存在，则根据Model名称拼接表名
                tableName = $"{m.Name.Replace("Model", "").Replace("Entity","")}";
            }

            //属性
            var ps = m.GetProperties();

            ps.ToList().ForEach(p =>
            {
                var pt = p.PropertyType; //获取这个属性的数据类型

                var v = p.GetValue(t, null); //获取这个属性的值，为空的表示没有赋值，就不用添加
                
                if (v != null)
                {
                    if (pt == typeof(DateTime))//判断数据类型
                    {
                        if (!v.ToString().Contains("0001/1/1 0:00:00"))
                        {
                            fieldName += $"{p.Name},";
                            fieldValue += $"@{p.Name},";
                        }
                    }
                    else if (!p.Name.ToLower().Equals("id"))
                    {

                        fieldName += $"{p.Name},";
                        fieldValue += $"@{p.Name},";

                    }
                }
            });

            sql = $"insert into {tableName}({fieldName.Trim(',')}) values({fieldValue.Trim(',')})";

            return sql;
        }

        public static string EntityToDapperInsertSql<T>(T t,string tableName)
        {
            string sql;
            string fieldName = "";
            string fieldValue = "";

            var m = t.GetType();   // typeof(T)

            //属性
            var ps = m.GetProperties();

            ps.ToList().ForEach(p =>
            {
                var pt = p.PropertyType; //获取这个属性的数据类型

                var v = p.GetValue(t, null); //获取这个属性的值，为空的表示没有赋值，就不用添加

                if (v != null)
                {
                    if (pt == typeof(DateTime))//判断数据类型
                    {
                        if (!v.ToString().Contains("0001/1/1 0:00:00"))
                        {
                            fieldName += $"{p.Name},";
                            fieldValue += $"@{p.Name},";
                        }
                    }
                    else if (!p.Name.ToLower().Equals("id"))
                    {

                        fieldName += $"{p.Name},";
                        fieldValue += $"@{p.Name},";

                    }
                }
            });

            sql = $"insert into {tableName}({fieldName.Trim(',')}) values({fieldValue.Trim(',')})";

            return sql;
        }
        //string sql = "update tablename set name=@name,age=@age where id=@id";
        public static string EntityToDapperUpdateSql<T>(T t)
        {
            string sql;
            string fieldName = "";

            var m = t.GetType();


            //获取表名（先通过特性-TableAttribute获取，如果不存在则拼接字符串）
            var a = m.GetCustomAttributes(typeof(TableAttribute), true);
            string tableName;
            if (a != null && a.Length > 0)
            {
                tableName = ((TableAttribute)a[0]).Name;
            }
            else
            {
                //不存在，则根据Model名称拼接表名
                tableName = $"{m.Name.Replace("Model", "")}";
            }

            //属性
            var ps = m.GetProperties();

            ps.ToList().ForEach(p =>
            {
                var pt = p.PropertyType; //获取这个属性的数据类型

                var v = p.GetValue(t, null); //获取这个属性的值，为空的表示没有赋值，就不用添加

                if (v != null)
                {
                    if (pt == typeof(DateTime))//判断数据类型
                    {
                        if (!v.ToString().Contains("0001/1/1 0:00:00"))
                        {
                            fieldName += $"{p.Name}=@{p.Name},";
                        }
                    }
                    else if (!p.Name.ToLower().Equals("id"))
                    {
                        fieldName += $"{p.Name}=@{p.Name},";
                    }
                }
            });

            sql = $"update {tableName} set {fieldName.Trim(',')} where id = @id";

            return sql;
        }
    }
}
